/**
  ******************************************************************************
  * @file    User/user.c
  * @author  JUSHENG Application Team
  * @version V1.0.4
  * @date    12-14-2021
  * @brief   Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; COPYRIGHT 2021 JUSHENG</center></h2>
  *
  *
  ******************************************************************************
  */ 

/* Includes ------------------------------------------------------------------*/
#include "include.h"
#include "user.h"
#include "tk_cfg.h"

u32 tk_value = 0;
u32 tk_value_last = 0;
u32 key_cnt;
bool key_hold_flag = false;
static u32 key_tick = 0;
static bool buz_begin = false;
static u32 buz_cur_tick = 0;
/**
  * @brief  LED dispaly gpio initialization function
  * @param  None
  * @retval None
  */
void disp_io_init(void)
{
    TYPE_LL_GPIO_INIT        gpio_struct;

    memset(&gpio_struct, 0x0, sizeof(gpio_struct));
    gpio_struct.gpio_pin   =  LL_GPIO_PIN_0 | LL_GPIO_PIN_1 | LL_GPIO_PIN_8
                             |LL_GPIO_PIN_9;
    gpio_struct.gpio_mode  = LL_GPIO_MODE_OUT;
    gpio_struct.gpio_speed_level = LL_GPIO_SPEED_LEVEL_0;
    ll_gpio_init(GPIOA, &gpio_struct);
      
    ll_gpio_reset_bits(GPIOA, LL_GPIO_PIN_0 | LL_GPIO_PIN_1 | LL_GPIO_PIN_8
                             |LL_GPIO_PIN_9);

    memset(&gpio_struct, 0x0, sizeof(gpio_struct));
    gpio_struct.gpio_pin   =  LL_GPIO_PIN_7;
    gpio_struct.gpio_mode  = LL_GPIO_MODE_OUT;
    gpio_struct.gpio_speed_level = LL_GPIO_SPEED_LEVEL_0;
    ll_gpio_init(GPIOB, &gpio_struct);
      
    ll_gpio_reset_bits(GPIOB, LL_GPIO_PIN_7);
    
    beep_init();
    
}



/**
  * @brief  TK handle function
  * @param  None
  * @retval None
  */

void tk_handle(void)
{
    while(1)
    {
         tk_value = tk_process();     
        if(is_systick_expired(key_tick,5))
        {
            if((tk_value == tk_value_last) && (0 != tk_value))
             {
                 if((key_cnt++ > 4)&&(false == key_hold_flag))
                 {
                    key_hold_flag = true;
                    switch(tk_value)
                    {
                        case 0x1:
                            ll_gpio_set_bits(GPIOA, LL_GPIO_PIN_0);     // LD1
                            break;
                        case 0x2:
                            ll_gpio_set_bits(GPIOA, LL_GPIO_PIN_1);     // LD2 
                            break;
                        case 0x4:
                            ll_gpio_set_bits(GPIOA, LL_GPIO_PIN_8);     // LD3   
                            break;
                        case 0x8:
                            ll_gpio_set_bits(GPIOA, LL_GPIO_PIN_9);     // LD4 
                            break;
                        default:
                            break;
                    }
                    beep_start();
                }
             }
             else
             {
                 key_hold_flag = false;
                 key_cnt = 0;
                 tk_value_last = tk_value;
                ll_gpio_reset_bits(GPIOA, LL_GPIO_PIN_0 | LL_GPIO_PIN_1 | LL_GPIO_PIN_8 | LL_GPIO_PIN_9);    //??seg????
             }
             key_tick = GetSysTick();
         }
        beep_check_stop();
    }
}

void beep_init(void)
{
    TYPE_LL_GPIO_INIT gpio_init_cfg;
    memset(&gpio_init_cfg, 0x0, sizeof(gpio_init_cfg));
    gpio_init_cfg.gpio_mode = LL_GPIO_MODE_AF;
    gpio_init_cfg.gpio_pin  = LL_GPIO_PIN_6;
    ll_gpio_init(GPIOB, &gpio_init_cfg);
    ll_gpio_pin_af_config(GPIOB, LL_GPIO_PIN_SOURCE_6, LL_GPIO_AF_0);
    
    TYPE_LL_TIMER_INIT timer_cfg;
    memset(&timer_cfg, 0x0, sizeof(timer_cfg));
    timer_cfg.prescaler = LL_TIMER_PSC_NONE;
    timer_cfg.timer_src_sel = LL_TIMER_SRC_SYS_RISING;
    ll_timer_init(TIMER4, &timer_cfg);
    
    
    TYPE_LL_TIMER_PWM_CFG pwm_cfg;
    memset(&pwm_cfg, 0x0, sizeof(pwm_cfg));
    pwm_cfg.pwm_duty = 6000;
    pwm_cfg.pwm_period = 12000;
    ll_timer_pwm_mode_config(TIMER4, &pwm_cfg);
                            
    delay_ms(5);
}


void beep_start(void)
{
    ll_timer_pwm_start(TIMER4);
    buz_cur_tick = GetSysTick();
    buz_begin = true;
}

void beep_check_stop(void)
{
    if((true == buz_begin) && (is_systick_expired(buz_cur_tick, 150)))
    { 
        ll_timer_pwm_stop(TIMER4);
        buz_begin = false;
    }

}

/**
  * @}
  */

/*************************** (C) COPYRIGHT 2021 JUSHENG ***** END OF FILE *****/
